package com.spring.format.code.generation.util.file;

import java.util.Date;
import java.util.List;

import com.spring.format.code.generation.constants.Constants;
import com.spring.format.code.generation.constants.FileNameEnumType;
import com.spring.format.code.generation.mybatis.po.TablePO;
import com.spring.format.code.generation.mybatis.vo.CreateFileVO;
import com.spring.format.code.generation.mybatis.vo.JavaAttributeVO;
import com.spring.format.code.generation.util.CommonCodeUtil;
import com.spring.format.code.generation.util.FieldUtil;
import com.spring.format.code.generation.util.NameUtil;
import com.spring.format.code.generation.util.PathUtil;

/**
 * 文件生成帮助类
 * 
 * @author lenovo
 *
 */
public class ShopDaoFileUtil {
	private ShopDaoFileUtil() {
	}

	public static String content(CreateFileVO fileVO) {
		TablePO tablePO = fileVO.getTablePO();
		List<JavaAttributeVO> attrVOList = fileVO.getAttrVOList();
		// po的类名
		String poName = NameUtil.createFileName(tablePO.getTable_name(), FileNameEnumType.PO_NAME);

		StringBuilder methodStr = new StringBuilder();
		// 文件头部
		methodStr.append(head(tablePO));
		// 新增
		methodStr.append(add(poName));
		// 批量新增
		methodStr.append(addBatch(poName));
		// 删除
		methodStr.append(delete(poName));
		// 修改
		methodStr.append(update(poName));
		// id 查询
		methodStr.append(queryById(poName));
		// 集合
		methodStr.append(list(poName));
		// 分页
		methodStr.append(page(poName));
		// 验证集合
		methodStr.append(queryValidateList(poName));
		// or条件获取唯一
		methodStr.append(uniqueByOr(poName));
		// or条件获取集合
		methodStr.append(listByOr(poName));
		// 数量查询
		methodStr.append(countNum(poName));
		// 状态修改
		methodStr.append(editStatus(poName));
		// 批量修改状态
		// methodStr.append(editStatusBatch(poName));
		// 查询需要交换sno的数据
		methodStr.append(queryBySno(poName));
		// 获取最大的排序号
		methodStr.append(queryMaxSno(poName));
		for (JavaAttributeVO attriVO : attrVOList) {
			// 特殊字段，特殊方法的追加代码(如排序字段，唯一索引字段，有自己方法的字段)
			methodStr.append(specialFieldAddition(attriVO, poName));
		}
		methodStr.append("} //end class");

		return methodStr.toString();

	}

	/** 特殊字段需要特殊的方法追加 **/
	public static String specialFieldAddition(JavaAttributeVO attriVO, String poName) {
		StringBuilder specialFieldAddition = new StringBuilder();
		/** 自己更新方法 **/
		if (FieldUtil.getHaveselfupdatefieldlist().indexOf(attriVO.getName()) >= 0) {
			specialFieldAddition.append(update(attriVO.getName(), NameUtil.updateName(attriVO.getName())));
		}
		// 是否有唯一索引（未完成，有唯一索引的字段可以生成自己的方法，如：id，不过字段索引属性，在数据库里面很复杂，这里就不再实现了）
		return specialFieldAddition.toString();
	}

	/** 查询需要交换sno的数据 **/
	public static String queryBySno(String poName) {
		StringBuilder methodStr = new StringBuilder();
		// 查询需要交换sno的数据
		methodStr.append(CommonCodeUtil.methodRemark("查询需要交换sno的数据")).append(" public ").append(poName).append(" ")
				.append(Constants.DAO_METHOD_QUERY_BY_SNO).append("( ").append(poName).append(" po ); \n ");
		return methodStr.toString();
	}

	/** 获取最大的排序号 **/
	public static String queryMaxSno(String poName) {
		StringBuilder methodStr = new StringBuilder();
		// 查询数量
		methodStr.append(" /**  \n ").append("  * 获取最大的排序号  \n ").append("  * @param po \n ").append("  */ \n ")
				.append("  public Integer ").append(Constants.DAO_METHOD_QUERY_MAX_SNO).append("( ").append(poName)
				.append("  po ); \n ");
		return methodStr.toString();
	}

	/** 数据验证时查询数据方法 **/
	public static String queryValidateList(String poName) {
		StringBuilder methodStr = new StringBuilder();
		// 数据验证时查询数据方法
		methodStr.append(" /**  \n ").append("  * 数据验证时查询数据  \n ").append("  * @param po \n ").append("  */ \n ")
				.append("  public List<").append(poName).append("> ").append(Constants.DAO_METHOD_QUERY_LIST_VALIDATE)
				.append("( ").append(poName).append("  po ); \n ");
		return methodStr.toString();
	}

	/** 唯一数据 or 条件 **/
	public static String uniqueByOr(String poName) {
		StringBuilder methodStr = new StringBuilder();

		// 根据or条件获取唯一数据
		methodStr.append(" /** 8 \n ").append(" * 根据or条件获取唯一数据 \n ").append(" * @param po \n ").append(" */ \n ")
				.append(" public ").append(poName).append(" ").append(Constants.DAO_METHOD_QUERY_UNIQUE_BY_OR)
				.append("( ").append(poName).append(" po ); \n ");
		return methodStr.toString();
	}

	/** list or 条件 **/
	public static String listByOr(String poName) {
		StringBuilder methodStr = new StringBuilder();
		// 根据or条件获取数据集合
		methodStr.append(" /** 9 \n ").append(" * 根据 or 条件获取数据集合 \n ").append(" * @param po \n ").append(" */ \n ")
				.append(" public List<").append(poName).append("> ").append(Constants.DAO_METHOD_QUERY_LIST_BY_OR)
				.append("( ").append(poName).append(" po ); \n ");
		return methodStr.toString();
	}

	/** 数量查询 **/
	public static String countNum(String poName) {
		StringBuilder methodStr = new StringBuilder();
		// 查询数量
		methodStr.append(" /**  \n ").append("  * 查询满足条件的数量  \n ").append("  * @param po \n ").append("  */ \n ")
				.append("  public Integer ").append(Constants.DAO_METHOD_QUERY_COUNT_NUM).append("( ").append(poName)
				.append("  po ); \n ");
		return methodStr.toString();
	}

	/** 分页 **/
	public static String page(String poName) {
		StringBuilder methodStr = new StringBuilder();
		// 查询分页
		methodStr.append(" /**  \n ").append("  * 查询分页  \n ").append("  * @param po \n ").append("  */ \n ")
				.append("  public List<").append(poName).append(">  ").append(Constants.DAO_METHOD_QUERY_PAGE)
				.append("( ").append(poName).append("  po ); \n ");
		return methodStr.toString();
	}

	/** 更改状态 **/
	public static String editStatus(String poName) {
		StringBuilder methodStr = new StringBuilder();
		// 更改数据状态
		methodStr.append(" /**  \n ").append("  * 根据ids 更改数据状态  \n ").append("  * @param po \n ").append("  */ \n ")
				.append("  public Integer  ").append(Constants.DAO_METHOD_EDIT_STATUS).append("( ").append(poName)
				.append("  po ); \n ");
		return methodStr.toString();
	}

	/** 集合 **/
	public static String list(String poName) {
		StringBuilder methodStr = new StringBuilder();
		// 根据 and 条件获取数据集合
		methodStr.append(" /**  \n ").append("  * 根据 and 条件获取数据集合  \n ").append("  * @param po \n ").append("  */ \n ")
				.append("  public List<").append(poName).append("> ").append(Constants.DAO_METHOD_QUERY_LIST)
				.append("( ").append(poName).append("  po ); \n ");
		return methodStr.toString();
	}

	/** 新增 **/
	public static String add(String poName) {
		StringBuilder methodStr = new StringBuilder();
		// 增加数据
		methodStr.append(" /**   \n ").append("  * 增加数据  \n ").append("  * @param po \n ").append("  */ \n ")
				.append("  public Integer ").append(Constants.DAO_METHOD_INSERT).append(" ( ").append(poName)
				.append("  po ); \n ");
		return methodStr.toString();
	}

	/** 批量新增 **/
	public static String addBatch(String poName) {
		StringBuilder methodStr = new StringBuilder();
		// 增加数据
		methodStr.append(" /**   \n ").append("  * 增加数据  \n ").append("  * @param po \n ").append("  */ \n ")
				.append("  public void ").append(Constants.DAO_METHOD_INSERT_BATCH).append(" ( List<").append(poName)
				.append(">  poList ); \n ");
		return methodStr.toString();
	}

	/** 删除 **/
	public static String delete(String poName) {
		StringBuilder methodStr = new StringBuilder();
		// 删除数据
		methodStr.append(" /**  \n ").append("  * 根据id删除  \n ").append("  * @param po \n ").append("  */ \n ")
				.append("  public Integer  ").append(Constants.DAO_METHOD_DELETE_BY_ID).append("( ").append(poName)
				.append("  po ); \n ");
		return methodStr.toString();
	}

	/** 修改 **/
	public static String update(String poName) {
		return update(poName, Constants.DAO_METHOD_UPDATE);
	}

	/** 修改 **/
	public static String update(String poName, String methodName) {
		StringBuilder methodStr = new StringBuilder();
		// 修改数据
		methodStr.append(" /**   \n ").append("  * 更新信息  \n ").append("  * @param po \n ").append("  */ \n ")
				.append("  public Integer ").append(methodName).append("( ").append(poName).append("  po ); \n ");
		return methodStr.toString();
	}

	/** 根据id查询 **/
	public static String queryById(String poName) {
		StringBuilder methodStr = new StringBuilder();
		// 根据id查询
		methodStr.append(" /**  \n ").append("  * 根据id查询  \n ").append("  * @param po \n ").append("  */ \n ")
				.append("  public ").append(poName).append(" ").append(Constants.DAO_METHOD_QUERY_BY_ID).append("( ")
				.append(poName).append("  po ); \n ");
		return methodStr.toString();
	}

	/** 头部 ***/
	public static String head(TablePO tablePO) {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append("package ")
				.append(PathUtil.createPackagePath(tablePO.getTable_name(), FileNameEnumType.DAO_API_NAME))
				.append(" \n").append("import java.util.List; \n").append("import java.util.Map; \n").append("import ")
				.append(PathUtil.createImportPath(tablePO.getTable_name(), FileNameEnumType.PO_NAME)).append(";\n")

				.append("/**\n").append("  *").append(tablePO.getTable_comment()).append("\n").append("  *@author ")
				.append(System.getProperties().getProperty("user.name")).append("\n").append("  *@version 1.0.0 ")
				.append(DateUtil.dateFormat(new Date(), DateUtil.DATE_FORMAT)).append(" \n").append("  */\n")
				.append("public interface ")
				.append(NameUtil.createFileName(tablePO.getTable_name(), FileNameEnumType.DAO_API_NAME))
				.append("  { \n");
		return methodStr.toString();
	}

	/** 批量修改状态的方法 ***/
	public static String editStatusBatch(String poName) {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append(" /** 11 \n ").append("  * 根据ids 更改数据状态  \n ").append("  * @param po \n ").append("  */ \n ")
				.append("  public Long  ").append(Constants.DAO_METHOD_EDIT_STATUS_BATCH).append("( ").append(poName)
				.append("  po ); \n ");

		return methodStr.toString();
	}

}
